#include <iostream>

using namespace std;

//模板的局限性
//模板的通用性并不是万能的
//模板的重载，可以为这些特定的类型提供具体化的模板

//利用具体化的模板，可以解决自定义类型的通用化
//学习模板并不是为了写模板，而是在STL能够运用系统提供的模板
class Person {
public:
    string name;
    int age;

    Person(string name, int age) {
        this->name = name;
        this->age = age;
    }
};

//对比两个数据是否相等
template<typename T>
bool myCompare(T &a, T &b) {
    if (a == b) {
        return true;
    } else {
        return false;
    }
}

//具体化，显示具体化的原型和定意思以template<>开头，并通过名称来指出类型
//具体化优先于常规模板
template<>
bool myCompare(Person &p1, Person &p2) {
    if (p1.name == p2.name && p1.age == p2.age) {
        return true;
    } else {
        return false;
    }
}

void test1() {
    int a = 10;
    int b = 20;
    bool flag = myCompare(a, b);
    if (flag) {
        cout << "两数相等" << endl;
    } else {
        cout << "两数不相等" << endl;
    }
}

void test2() {
    Person p1("tom", 18);
    Person p2("jerry", 18);
    bool flag = myCompare(p1, p2);
    if (flag) {
        cout << "两个人相等" << endl;
    } else {
        cout << "两个人不相等" << endl;
    }
}

int main() {
    test1();
    test2();
    return 0;
}